Если спросить питонистов, какую библиотеку использовать для визуализации данных, то большинство, несомненно, ответят: matplotlib или Seaborn. Ответят, правда, без особого удовольствия. Многое в этих библиотеках не так уж очевидно и требует не раз обратиться к StackOverflow. Касается это и таких распространенных ситуаций, как создание дополнительных осей или отображение на них дат.
Нужно понимать, что matplotlib создавался задолго до бурного развития Data Science, и в большей мере ориентировался на отображение массивов NumPy и параметрических функций SciPy. В то же время в Data Science распространен обобщающий тип объектов – датасеты, крупные таблицы с данными. Но существует альтернативная библиотека, которая позволяет создавать красивые, интерактивные, экспортируемые графики с помощью всего нескольких строк кода plotly.
Данная библиотека была создана одноименной компанией, владеющей множеством программ с открытым исходным кодом для создания интерактивных графиков и чартов. Зарабатывает компания за счет предоставления расширенного пакета функций своих программ. Также за отдельную плату она предлагает настроить Ваш собственный хостинг. Компания базируется в Монреале с офисом в Бостоне.
Plotly.py основывается на JavaScript-библиотеке D3.js. Также в Plotly есть API-обертки для R, Scala и многих других языков программирования. Стоит отметить, что документация представлена не на всех языках.

Plotly — библиотека для визуализации данных, состоящая из нескольких частей:
Так же на базе plotly и веб-сервера Flask существует специальная библиотека для создания дашбордов Dash.
C помощью Plotly можно как изучать какие-то данные «на лету» (не перестраивая график в matplotlib, изменяя масштаб, включая/выключая какие-то данные), так и построить полноценный интерактивный отчёт (дашборд).
Установить пакет plotly довольно лего с помощью пакета контроля версий pip
pip install plotly
Импортируем нужные нам библиотек ниже и можем приступать к созданию инфографики
import plotly.express as px
import numpy as np
import plotly.offline as py
import plotly.graph_objects as go
Начнём с простой задачи построения графика по точкам.
Используем функцию
$f(x) = x^{2}$
Сперва поступим совсем просто и «в лоб»:
Создадим график с помощью функции line из подмодуля plotly.express (внутрь передадим 2 списка точек: координаты X и Y) Тут же «покажем» его с помозью метода show()
Обратите внимание — график интерактивный, если навести на него курсор, то можно его приближать и удалять, выделять участки, по наведению курсора на точку получать подробную информацию, возвращать картинку в исходное положение, а при необходимости «скриншотить» и сохранять как файл.
Всё это делается с помощью JS в вашем браузере.
py.init_notebook_mode(connected=False) # здесь и в дальнейшем служит для отображения графика в Jupyter Notebook, т.е. обращать на её внимания не нужно
x = np.arange(0, 5, 0.1)
f = lambda x: x**2
fig = px.line(x=x, y=f(x))
fig.show()
fig =
px.line(x=x, y=f(x))
fig.show()
2 строчки и готовый результат. Т.к. мы используем Express. Быстро и просто.
Но маловато гибкости, поэтому мы практически сразу переходим к более продвинутому уровню — plotly.graph_objects сразу создадим фигуру и нанесём на неё объекты.
fig = go.Figure()
#Здесь будет код
fig.show()
Как видим, пока пусто.
Чтобы добавить что на график нам понадобится метод фигуры add_trace
fig.add_trace(ЧТО ХОТИМ ОТОБРАЗИТЬ)
В качестве аргумента мы передаем что хотим нарисовать. График по точкам. График мы уже рисовали с помощью Line в Экспрессе, у Объектов это - Scatter. Вот что он делает:
go.Scatter(x=x, y=f(x))
Scatter({
'x': array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2, 1.3,
1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. , 4.1,
4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9]),
'y': array([0.000e+00, 1.000e-02, 4.000e-02, 9.000e-02, 1.600e-01, 2.500e-01,
3.600e-01, 4.900e-01, 6.400e-01, 8.100e-01, 1.000e+00, 1.210e+00,
1.440e+00, 1.690e+00, 1.960e+00, 2.250e+00, 2.560e+00, 2.890e+00,
3.240e+00, 3.610e+00, 4.000e+00, 4.410e+00, 4.840e+00, 5.290e+00,
5.760e+00, 6.250e+00, 6.760e+00, 7.290e+00, 7.840e+00, 8.410e+00,
9.000e+00, 9.610e+00, 1.024e+01, 1.089e+01, 1.156e+01, 1.225e+01,
1.296e+01, 1.369e+01, 1.444e+01, 1.521e+01, 1.600e+01, 1.681e+01,
1.764e+01, 1.849e+01, 1.936e+01, 2.025e+01, 2.116e+01, 2.209e+01,
2.304e+01, 2.401e+01])
})
А теперь объединим, добавим Обьект на график:
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=f(x)))
fig.show()
Кроме того, такой способ позволит нам нанести на график столько объектов, сколько мы хотим:
g=[1, 2, 3, 4]
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=f(x)))
fig.add_trace(go.Bar(x=g, y=[1, 8, 9, 16]))
fig.show()
Справа появилась ещё и легенда!
Впрочем, логично, пока график был один, зачем нам легенда?
Но магия Plotly тут не заканчивается. Нажмите на любую из подписей в легенде и соответствующий график исчезнет, а надпись станет более бледной. Вернуть их позволит повторный клик.
Изменить Легенду можно следующим образом:
g=[1, 2, 3, 4]
colors = ['lightslategray',] * 4
colors[1] = 'crimson'
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=f(x), name = 'f(x)=x<sup>2</sup>'))
fig.add_trace(go.Bar(x=g, y=[1, 8, 9, 16], name = 'Столбцовая диаграмма', marker_color=colors))
fig.update_layout(legend_orientation="h")
fig.show()
Мы изменили назване Объектов в легенде с помощью атрибута name (для графика $f(x) = x^{2}$ использовались тег sup HTML чтобы корректно отображать степень, так же plotly поддерживает $\LaTeX{}$)
Ещё можно видеть что мы изменили цвет, цвет маркера marker_color может быть однозначным проитерирован
Помимо этого изменили положение легенды с помощью fig.update_layout() и атрибута legend_orientation, более подробно о возможных манипуляциях с легендой можно посмотреть здесь
С основыми мы разобрались, теперь посмотрим примеры!
import plotly.graph_objects as go
py.init_notebook_mode(connected=False)
fig = go.Figure(data=[go.Pie(
labels=['ТехСтанкоМаш', 'Компания А', 'Компания Б', 'Компания B', 'Компания Г', 'Компания Д', 'РусСтанкоСтрой',
'Компания E', 'Компания Ж'],
values=[23, 9, 8, 10, 11, 7, 25, 10, 6])])
fig.update_traces(hoverinfo='label+value', textinfo='value', textfont_size=20, textfont_color='#000000',
marker=dict(line=dict(color='#000000', width=2)))
fig.update_layout(title="№1 Задание лабораторной работы")
fig.show()